"""
对logging模块的封装
定义一个Logger类，实例化这个类可以得到一个日志记录器对象
设置好日志的格式器和处理器
"""
import logging
import os
import time
from lib.re_config import CONFIG

class LoginClient(object):
    __logger = None
    def __new__(cls, *args, ** kwargs):
        if cls.__logger is not None:
            return cls.__logger
        # 创建日志记录器
        Logger = logging.getLogger('AuthTestLog')
        Logger.setLevel(logging.DEBUG)

        # 创建日志终端处理器
        SH = logging.StreamHandler()
        SH.setLevel(getattr(logging,CONFIG['logger']['shLevel'].upper()))

        # 创建日志文件处理器
        current_path = os.path.abspath(__file__)
        root_path = os.path.dirname(os.path.dirname(current_path))
        file_path = os.path.join(root_path,'login')

        # 如果 file_path 不是一个空文件夹则执行创建文件夹的指令（可以解决可以事先创建好空文件的问题）
        if not os.path.dirname(file_path):
            os.mkdir(file_path)

        file_name = time.strftime('%Y-%m-%d.log')
        file_name_path = os.path.join(file_path,file_name)
        FH = logging.FileHandler(filename =file_name_path,mode='w',encoding='utf-8')
        # 利用反射原理，这样的好处在与想要修改处理器的默认登记时，可以直接通过修改 config.ini 中的配置实现，而不需要在大量的代码中寻找到具体的代码修改
        FH.setLevel(getattr(logging, CONFIG['logger']['fhLevel'].upper()))

        # 创建日志格式器
        Fm = logging.Formatter(
            fmt='[%(name)s-%(lineno)d-%(levelname)s-%(asctime)s]:%(message)s',
            datefmt='%Y-%m-%d %I:%M:%S %p'
        )

        # 日志处理器与日志格式器关联
        SH.setFormatter(Fm)
        FH.setFormatter(Fm)

        # 将关联好的日志处理器放入记录器当中
        Logger.addHandler(SH)
        Logger.addHandler(FH)
        LoginClient.__logger = Logger
        return LoginClient.__logger

